// 配置信息
package setting

import (
	"flag"
	"gopkg.in/ini.v1"
	"log"
)

// 日志配置
type LoggerSetting struct {
	LogDir     string // 日志存储地址
	OutputType string // 日志输出模式
	LogLevel   string //日志级别; TRACE, DEBUG, INFO, WARN, ERROR, FATAL, PANIC
}

// 服务配置
type ServerSetting struct {
	Host    string // 服务绑定的主机名
	Port    string // 服务绑定的端口
	GinMode string // gin模式
}

// 应用配置
type AppSetting struct {
	Mode string // app 模式：开发环境、测试环境，生产环境
}

// Db配置
type DbSetting struct {
	User     string // 用户名
	Password string // 密码
	DbName   string // 数据库名称
	Port     uint   // 端口
	SslMode  string // ssl模式
	TimeZone string //市区
}

const (
	DEFAULT_CONFIG_FILE_PATH = "conf/application-dev.ini" // 默认配置文件
)

var LOGGER_SETTING = &LoggerSetting{}
var SERVER_SETTING = &ServerSetting{}
var APP_SETTING = &AppSetting{}
var DB_SETTING = &DbSetting{}

var cfg *ini.File

func Setup() {
	var err error

	var configFilePath string
	flag.StringVar(&configFilePath, "f", DEFAULT_CONFIG_FILE_PATH, "配置文件地址")
	flag.Parse()

	cfg, err = ini.Load(configFilePath)
	if err != nil {
		log.Fatalf("setting.Setup, fail to parse 'conf/app.ini': %v", err)
	}

	mapTo("app", APP_SETTING)
	mapTo("logger", LOGGER_SETTING)
	mapTo("server", SERVER_SETTING)
	mapTo("db", DB_SETTING)

	log.Println("app mode:", APP_SETTING.Mode)
}

// mapTo map section
func mapTo(section string, v interface{}) {
	err := cfg.Section(section).MapTo(v)
	if err != nil {
		log.Fatalf("Cfg.MapTo %s err: %v", section, err)
	}
}
